# 注：此代码基于模拟豆瓣接口运行。具体方法请群内咨询crossin
# 2 电影信息及海报图片下载
import requests as rs
import csv, time

# 下载图片并保存在当前文件夹，两个参数分别是 图片链接 和 图片名
def download_image(pic_url, name):
    req = rs.get(pic_url)  # 去请求这个图片的 url，请求成功会返回该图片
    pic_data = req.content  # 图片是非文本格式数据，对于非文本请求：用 content 属性返回二进制结果

    # 当前路径下，打开 .jpg 并写入，参数 'wb' 中，'w' 是写入，'b' 说明写入的格式是二进制格式
    with open(str(name) + '.jpg', 'wb') as f:
        f.write(pic_data)

    print(pic_url, '下载成功')

url = 'http://127.0.0.1:8080/v2/movie/subject/11'  # 电影 api 的 url（详细电影信息）
req = rs.get(url)  # 利用api 获取一部电影的信息
print(req)
data = req.json()
try:
    pic_url = data['img']  # 通过字典获取海报图片的 url
    download_image(pic_url, 'poster')  # 调用下载图片的函数
except:
    print('请求图片地址不存在')

# 以下是获取 top 250 电影信息并保存 csv 的代码
def top_250(start=0):
    results = [] # 用一个列表记录所有抓取的数据

    while start < 250: # 抓取的 url 一次返回 20 条数据，start 是抓取的开始条目，如果小于 250，就继续循环抓取，直到抓取 250 条数据为止
        url = 'http://127.0.0.1:8080/v2/movie/top250?start=%d' % start # 用字符串的格式化拼接 url
        req = rs.get(url) # 请求对应 url 的 json 格式数据
        time.sleep(2) # 限制访问网站的请求频率
        data = req.json()

        with open('moives.csv', 'a') as f: # 打开 movies.csv 并追加写入
            f_csv = csv.writer(f) # 将文件对象作为参数传给csv.writer()
            for item in data['movies']: # 遍历电影信息
                print(item)
                line = [item['id'], item['name'], item['star'], item['director'], item['quote'], item['img']] # 把各项信息组成列表，用于写入 csv
                results.append(line) # 将结果保存在一个列表
                f_csv.writerow(line) # 一次写入一行信息
                start = item['id'] + 1  # 更新下次抓取的起始id，设为当前抓取过的后一个值

        print('请求完成：', url)

    return results # 返回请求结果

results = top_250(240) # 调用函数，获得 top 250 的一个列表；如果之前已经抓取了部分，可以设定start的位置
# print(results)

# 保存海报图片
# 可以同上一步抓取一起执行，也可以从csv中读取数据
# with open('movies.csv') as f:
#     f_csv = csv.reader(f)
#     results = list(f_csv)

# 循环遍历 results，下载每一部电影的图片
for i in results:
    url_image = i[-1]  # 图片链接是最后一项
    name = i[0]  # 用电影id做图片名

    print('正在下载：', url_image)

    download_image(url_image, name)

    time.sleep(2)  # 限制访问网站的请求频率
